﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.DirectoryServices.ActiveDirectory;
using System.DirectoryServices;

namespace ChangePasswordWebpart
{
    public static class LDAPUtils
    {
        public static string GetLdapDomainName(string friendlyDomainName)
        {
            string ldapPath = null;
            try
            {
                DirectoryContext objContext = new DirectoryContext(DirectoryContextType.Domain, friendlyDomainName);
                Domain objDomain = Domain.GetDomain(objContext);
                ldapPath = objDomain.Name;
            }
            catch (DirectoryServicesCOMException)
            {
                ldapPath = string.Empty;
            }

            return ldapPath;
        }

        public static bool Authenticate(string userName, string password, string domain, out string error)
        {
            bool authentic = false;
            error = string.Empty;
            try
            {
                DirectoryEntry entry = new DirectoryEntry("LDAP://" + domain, userName, password);
                object nativeObject = entry.NativeObject;
                authentic = true;
                entry.Close();
            }
            catch (Exception ex) 
            {
                error = String.Format("{0}({1})", ex.Message, domain);
            }

            return authentic;
        }

        public static bool ChangePassword(string userName, string password, string newPassword, string domain, out string error)
        {
            bool changed = false;
            error = string.Empty;

            try
            {
                DirectoryEntry entry = new DirectoryEntry("LDAP://" + domain, userName, password);
                DirectorySearcher search = new DirectorySearcher(entry);
                search.Filter = "(SAMAccountName=" + userName + ")";
                search.SearchScope = SearchScope.Subtree;
                search.CacheResults = false;

                SearchResultCollection results = search.FindAll();
                if (results.Count == 0)
                    throw new ArgumentException("Unable to find user in directory.");

                DirectoryEntry userEntry = results[0].GetDirectoryEntry();
                userEntry.Invoke("ChangePassword", new object[] { password, newPassword });
                userEntry.Close();
                entry.Close();

                changed = true;
            }
            catch (Exception ex)
            {
                if (ex.InnerException == null)
                    error = String.Format("{0}({1})", ex.Message, domain);
                else
                    error = String.Format("{0}({1})", ex.InnerException.Message, domain);
            }

            return changed;
        }
    }
}
